﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SILAS.Entidades;
using PagedList;


namespace SILAS.DAO
{
	public class VisitaDAO : MasterDAO, IVisitaDAO
	{


		public PagedList.IPagedList<Visita> GetAllFromVisita(Int32 page, Int32 size)
		{
			var query = from v in context.Visitas
						orderby v.Id
						select v;
			return query.OrderBy(v => v.Id).ToPagedList(page, size);
		}

		public PagedList.IPagedList<Visita> GetAllFromVisitaByCriterio(string criterio, int page, int size)
		{
			throw new NotImplementedException();
		}

		public Visita getFromVisitabyId(int id)
		{
			return context.Visitas.Find(id);

		}

		public void agregarVisita(Visita visita)
		{
			context.Visitas.Add(visita);
			context.SaveChanges();
		}

		public void modificarVisita(Visita visita)
		{
			var existe = context.Visitas.Find(visita.Id);

			
			for (int i = 0; i < visita.DetalleVisitas.Count; i++)
			{
				DetalleVisita ciudadano = null;

				if (visita.DetalleVisitas[i].IdCiudadano !=null )
				{
					ciudadano = existe.DetalleVisitas.Where(c => c.IdCiudadano.Equals(visita.DetalleVisitas[i].IdCiudadano)).SingleOrDefault();
				}

				DetalleVisita empleado = null;

				if (visita.DetalleVisitas[i].IdEmpleado !=null)
				{
					empleado = existe.DetalleVisitas.Where(e => e.IdEmpleado.Equals(visita.DetalleVisitas[i].IdEmpleado)).SingleOrDefault();
				}            
				
				if (ciudadano == null)
				{
					var detalle = new DetalleVisita() { IdCiudadano = visita.DetalleVisitas[i].IdCiudadano };
					existe.DetalleVisitas.Add(detalle);
				}

				if (empleado == null)
				{
					var detalle = new DetalleVisita() { IdEmpleado = visita.DetalleVisitas[i].IdEmpleado };
					existe.DetalleVisitas.Add(detalle);
				}

			}


			for (int i = 0; i < existe.DetalleVisitas.Count; i++)
			{
				DetalleVisita ciudadano = null;

				if (existe.DetalleVisitas[i].IdCiudadano !=null)
				{
					ciudadano = visita.DetalleVisitas.Where(e => e.IdCiudadano.Equals(existe.DetalleVisitas[i].IdCiudadano)).SingleOrDefault();
				}                

				if (ciudadano == null)
				{
					var ciudExiste = existe.DetalleVisitas[i];

					if (ciudExiste.IdEmpleado== null)
					{
						existe.DetalleVisitas.Remove(ciudExiste);
					}
					else
					{
						existe.DetalleVisitas[i].IdCiudadano = null;
					}
				}
			}

			for (int j = 0; j < existe.DetalleVisitas.Count; j++)
			{
				DetalleVisita empleado = null;

				if (existe.DetalleVisitas[j].IdEmpleado!=null)
				{
					empleado = visita.DetalleVisitas.Where(e => e.IdEmpleado.Equals(existe.DetalleVisitas[j].IdEmpleado)).SingleOrDefault();
				}
			   

				if (empleado == null)
				{
					var emplExiste = existe.DetalleVisitas[j];

					if (emplExiste.IdCiudadano == null)
					{
						existe.DetalleVisitas.Remove(emplExiste);
					}
					else
					{
						existe.DetalleVisitas[j].IdEmpleado = null;
					}
				}
			}

		  
			context.Entry(existe).State = System.Data.EntityState.Modified;
			context.SaveChanges();

		}

		public void eliminarVisita(int id)
		{
			var existe = context.Visitas.Find(id);

			if (existe != null)
			{
				context.Visitas.Remove(existe);
				context.SaveChanges();
			}
		}


		public void eliminarDetalleciu(int iddeta, int idciu, int idVisi)
		{
			var existe = context.DetalleVisitas.Find(iddeta, idVisi);

			if (existe != null)
			{
				var ci = (from c in context.DetalleVisitas
						  where c.Id == iddeta && c.IdCiudadano == idciu
						  select c).Single();

				ci.IdCiudadano = null;
				context.SaveChanges();

				if (ci.IdCiudadano == null && ci.IdEmpleado == null)
				{
					context.DetalleVisitas.Remove(existe);

				}
			}
		}

		public void eliminarDetalleemple(int iddeta, int idemple, int idVisi)
		{
			var existe = context.DetalleVisitas.Find(iddeta, idVisi);

			if (existe != null)
			{
				var ci = (from c in context.DetalleVisitas
						  where c.Id == iddeta && c.IdEmpleado == idemple
						  select c).Single();

				ci.IdEmpleado = null;
				context.SaveChanges();

				if (ci.IdCiudadano == null && ci.IdEmpleado == null)
				{
					context.DetalleVisitas.Remove(existe);

				}
			}
		}
	}
}
